package com.yjha.huazhubusiness.service.impl;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.yjha.huazhubusiness.bean.XyInfo;
import com.yjha.huazhubusiness.bean.XyxtXyxxJbxxb;
import com.yjha.huazhubusiness.mapper.XyxtXyxxJbxxbMapper;
import com.yjha.huazhubusiness.service.XyInfoService;
import com.yjha.huazhubusiness.service.XyxtXyxxJbxxbService;
import cn.hutool.core.util.StrUtil;
import com.yjha.huazhubusiness.utils.*;
import com.yjha.huazhubusiness.vo.XyxtXyxxJbxxbVo;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * 基本信息表
 *
 * @author Mark sunlightcs@gmail.com
 * @since 1.0.0 2025-07-15
 */
@Service
public class XyxtXyxxJbxxbServiceImpl extends ServiceImpl<XyxtXyxxJbxxbMapper, XyxtXyxxJbxxb> implements XyxtXyxxJbxxbService {

    @Value("${hz.url.loginUrl}")
    String  loginUrl;
    @Value("${hz.url.getTokenUrl}")
    String  getTokenHttpUrl;
    @Value("${hz.clientid}")
    String clientid;
    @Value("${hz.secret}")
    String secret;
    @Value("${hz.cardId}")
    String cardId;
    @Value("${hz.cardPassWord}")
    String cardPassWord;
    @Value("${hz.invoiceNo}")
    String invoiceNoVal;
    @Value("${hz.travelType}")
    String travelTypeVal;
    @Value("${hz.sKey}")
    String sKey;
    @Autowired
    private RedisUtils redisUtils;
    @Autowired
    private HzUtils hzUtils;

    @Autowired
    private XyInfoService xyInfoService;

    @Override
    public QueryWrapper<XyxtXyxxJbxxb> getWrapper(Map<String, Object> params){
        String id = (String)params.get("id");

        QueryWrapper<XyxtXyxxJbxxb> wrapper = new QueryWrapper<>();
        wrapper.eq(StrUtil.isNotBlank(id), "id", id);

        return wrapper;
    }

//    @Override
//    @Transactional
//    public R getUser(XyxtXyxxJbxxb xyxtXyxxJbxxb) {
//        QueryWrapper<XyxtXyxxJbxxb> xyxtXyxxJbxxbQueryWrapper = new QueryWrapper<>();
//        String xm = xyxtXyxxJbxxb.getXm();
//        String xybh = xyxtXyxxJbxxb.getXybh();
//        String sfzjh = xyxtXyxxJbxxb.getSfzjh();
//
//        if (StringUtils.isEmpty(xm)) {
//            // 如果姓名为空，直接返回错误
//            return R.error(400, "姓名不能为空");
//        }
//        // 确保姓名(xm)必须存在
//        xyxtXyxxJbxxbQueryWrapper.eq("XM", xm);
//
//        // 构建组合条件：(xybh存在 OR sfzjh存在)
//        boolean hasXybh = StringUtils.isNotBlank(xybh);
//        boolean hasSfzjh = StringUtils.isNotBlank(sfzjh);
//
//        if (hasXybh || hasSfzjh) {
//            xyxtXyxxJbxxbQueryWrapper.and(wrapper -> {
//                if (hasXybh) {
//                    wrapper.eq("XYBH", xybh);
//                }
//                if (hasSfzjh) {
//                    // 如果xybh也存在，添加OR连接
//                    if (hasXybh) {
//                        wrapper.or();
//                    }
//                    wrapper.eq("SFZJH", sfzjh);
//                }
//            });
//        } else {
//            // 如果xybh和sfzjh都为空，添加永假条件确保查询无结果
//            xyxtXyxxJbxxbQueryWrapper.and(wrapper -> wrapper.eq("1", "2"));
//        }
//
//        List<XyxtXyxxJbxxb> list = this.list(xyxtXyxxJbxxbQueryWrapper);
//
//        if (list.isEmpty()) {
//            return R.error(400, "校友数据收集中");
//        }
//
//        String accessToken = "";
//
//        String resutl = hzUtils.doPost(getTokenHttpUrl,clientid,secret);
//
//        if (StringUtils.isEmpty(resutl)){
//            return R.error(400,"鉴权失败");
//        }
//        JSONObject jsonObject = JSON.parseObject(resutl);
//        accessToken = (String)jsonObject.get("access_token");
//
//        String rest = hzUtils.addUser(xyxtXyxxJbxxb, accessToken);
//
//        if (StringUtils.isEmpty(rest)){
//            return R.error(400,"鉴权失败");
//        }
//
//        JSONObject jsonObject1 = JSON.parseObject(rest);
//
//        if (!"200".equals(jsonObject1.get("code").toString()) && !"400".equals(jsonObject1.get("code").toString())){
//            return R.error(400,"校友数据收集中");
//        }
//
//        // 华住编号
//        String ygbh = xyxtXyxxJbxxb.getSfzjh()+"001";
//
//        if("400".equals(jsonObject1.get("code").toString())){
//            XyInfo one = xyInfoService.getOne(new QueryWrapper<XyInfo>().eq("name", xyxtXyxxJbxxb.getXm()).eq("phone", xyxtXyxxJbxxb.getPhone()).eq("sfzjh", xyxtXyxxJbxxb.getSfzjh()));
//
//            if(one != null){
//                SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//                String format = simpleDateFormat.format(new Date());
//                String src = cardId + "&" + one.getUserNumber() + "&" + format;
//                String encrypt = HzUtils.encrypt(src, sKey);
//
//                String url = loginUrl + cardId + "&userNumber=" + one.getUserNumber() + "&authorizeSign=" + encrypt;
//
//                return R.ok().put("data",url);
//            }else{
//                SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//                String format = simpleDateFormat.format(new Date());
//                String src = cardId + "&" + ygbh + "&" + format;
//                String encrypt = HzUtils.encrypt(src, sKey);
//
//                String url = loginUrl + cardId + "&userNumber=" + ygbh + "&authorizeSign=" + encrypt;
//
//                addXyInfo(list.get(0),xyxtXyxxJbxxb.getPhone(),ygbh);
//
//                return R.ok().put("data",url);
//            }
//
//        }
//
//        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//        String format = simpleDateFormat.format(new Date());
//        String src = cardId + "&" + ygbh + "&" + format;
//        String encrypt = HzUtils.encrypt(src, sKey);
//
//        String url = loginUrl + cardId + "&userNumber=" + ygbh + "&authorizeSign=" + encrypt;
//
//        // 补全校友信息
//        addXyInfo(list.get(0),xyxtXyxxJbxxb.getPhone(),ygbh);
//
//        return R.ok().put("data",url);
//    }

    @Override
    @Transactional
    public R getUser(XyxtXyxxJbxxb xyxtXyxxJbxxb) {
        // 构建查询条件
        QueryWrapper<XyxtXyxxJbxxb> xyxtXyxxJbxxbQueryWrapper = new QueryWrapper<>();
        xyxtXyxxJbxxbQueryWrapper.eq("XM",xyxtXyxxJbxxb.getXm());
        xyxtXyxxJbxxbQueryWrapper.eq("SFZJH",xyxtXyxxJbxxb.getSfzjh());
        //查询校友
        List<XyxtXyxxJbxxb> list = this.list(xyxtXyxxJbxxbQueryWrapper);

        if (list.size() <= 0) {
            return R.error(400, "校友数据收集中");
        }

        // 鉴权获取华住token
        String hzToken = hzAuth();

        if (StringUtils.isEmpty(hzToken)){
            return R.error(400, "鉴权失败");
        }

        // 1，获取校员编号，进行华住接口检验该编号是否存在
        boolean hzUserByXybh = isHzUser(list.get(0).getXybh(), hzToken);
        if (!hzUserByXybh){ // 使用校员编号如果不是华住用户
            boolean hzUserBySFZJH = isHzUser(list.get(0).getSfzjh() + "001", hzToken);
            if (!hzUserBySFZJH){ // 如果没有该编号的用户
                int code = addHzUser(xyxtXyxxJbxxb, hzToken);
                if(code != 200){
                    return R.error(400, "校友数据收集中");
                }else {
                    String url = getLoginUrl(list.get(0).getSfzjh()+"001");
                    // 记录注册华住用户信息
                    addXyInfo(xyxtXyxxJbxxb,xyxtXyxxJbxxb.getPhone(),xyxtXyxxJbxxb.getSfzjh()+"001");
                    return R.ok().put("data",url);
                }
            }else {// 如果有该编号的用户
                String url = getLoginUrl(list.get(0).getSfzjh()+"001");
                return R.ok().put("data",url);
            }
        }else{ // 使用校员编号是华住用户
            String url = getLoginUrl(list.get(0).getXybh());
            return R.ok().put("data",url);
        }
    }


    /**
     * 华住鉴权接口
     * @return
     */
    public String hzAuth(){
        String resutl = hzUtils.doPost(getTokenHttpUrl,clientid,secret);
        if (StringUtils.isEmpty(resutl)){
            return null;
        }
        JSONObject jsonObject = JSON.parseObject(resutl);
        return (String)jsonObject.get("access_token");
    }

    /**
     * 判断该编号是否在华住平台存在
     * @param userNumber
     * @param hzToken
     * @return
     */
    public boolean isHzUser(String userNumber, String hzToken){
        String hzUser = hzUtils.getHxUser(userNumber, hzToken);
        if (StringUtils.isEmpty(hzUser)){
            return false;
        }
        JSONObject jsonObject = JSON.parseObject(hzUser);
        String code =(String) jsonObject.get("code");

        if("200".equals(code)){
            return true;
        }
        if("400".equals(code) || "500".equals(code) || "521".equals(code)){
            return false;
        }
        return false;
    }

    /**
     * 添加华住用户
     * @param xyxtXyxxJbxxb
     * @param accessToken
     * @return
     */
    public int addHzUser(XyxtXyxxJbxxb xyxtXyxxJbxxb, String accessToken){
        String rest = hzUtils.addUser(xyxtXyxxJbxxb, accessToken);

        if (StringUtils.isEmpty(rest)){
            return 400;
        }

        JSONObject jsonObject1 = JSON.parseObject(rest);

        return Integer.parseInt(jsonObject1.get("code").toString());
    }

    /**
     * 获取跳转链接
     * @param userNumber 员工编号
     * @return
     */
    public String getLoginUrl(String userNumber){
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String format = simpleDateFormat.format(new Date());
        String src = cardId + "&" + userNumber + "&" + format;
        String encrypt = HzUtils.encrypt(src, sKey);

        return loginUrl + cardId + "&userNumber=" + userNumber + "&authorizeSign=" + encrypt;
    }

    public boolean addXyInfo(XyxtXyxxJbxxb xyxtXyxxJbxxb, String phone,String usernumber) {
        XyInfo xyInfo = new XyInfo();
        xyInfo.setName(xyxtXyxxJbxxb.getXm());
        xyInfo.setPhone(phone);
        xyInfo.setSfzjh(xyxtXyxxJbxxb.getSfzjh());
        xyInfo.setXybh(xyxtXyxxJbxxb.getXybh());
        xyInfo.setXy_id(xyxtXyxxJbxxb.getXyid());
        xyInfo.setUserNumber(usernumber);
        return xyInfoService.save(xyInfo);
    }


}
